﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Json.Test {
    public static class JsonObjectGenerate {
        public static IDictionary<string, JsonBoolean> GenerateJsonBooleans() {
            IDictionary<string, JsonBoolean> jsons = new Dictionary<string, JsonBoolean>();

            jsons.Add("JsonBooleanDefault", new JsonBoolean());
            jsons.Add("JsonBooleanTrue", new JsonBoolean(true));
            jsons.Add("JsonBooleanFalse", new JsonBoolean(false));

            return jsons;
        }

        public static IList<JsonBoolean> GenerateJsonBooleanList() {
            IList<JsonBoolean> jsons = new List<JsonBoolean>();

            jsons.Add(new JsonBoolean());
            jsons.Add(new JsonBoolean(true));
            jsons.Add(new JsonBoolean(false));

            return jsons;
        }

        public static IDictionary<string, JsonDateTime> GenerateJsonDateTime(DateTime now) {
            IDictionary<string, JsonDateTime> jsons = new Dictionary<string, JsonDateTime>();

            jsons.Add("JsonDateTimeDefault", new JsonDateTime());
            jsons.Add("JsonDateTimeNow", new JsonDateTime(now));
            jsons.Add("JsonDateTimeMinValue", new JsonDateTime(DateTime.MinValue));
            jsons.Add("JsonDateTimeMaxValue", new JsonDateTime(DateTime.MaxValue));

            return jsons;
        }

        public static IList<JsonDateTime> GenerateJsonDateTimeList(DateTime now) {
            IList<JsonDateTime> jsons = new List<JsonDateTime>();

            jsons.Add(new JsonDateTime());
            jsons.Add(new JsonDateTime(now));
            jsons.Add(new JsonDateTime(DateTime.MinValue));
            jsons.Add(new JsonDateTime(DateTime.MaxValue));

            return jsons;
        }

        public static IDictionary<string, JsonNumber> GenerateJsonNumber() {
            IDictionary<string, JsonNumber> jsons = new Dictionary<string, JsonNumber>();

            jsons.Add("JsonNumberDefault", new JsonNumber());
            jsons.Add("JsonNumberZero", new JsonNumber(0));

            // byte
            jsons.Add("JsonNumberByteMinValue", new JsonNumber(byte.MinValue));
            jsons.Add("JsonNumberByteMaxValue", new JsonNumber(byte.MaxValue));

            // short
            jsons.Add("JsonNumberInt16MinValue", new JsonNumber(short.MinValue));
            jsons.Add("JsonNumberInt16MaxValue", new JsonNumber(short.MaxValue));

            // int
            jsons.Add("JsonNumberInt32MinValue", new JsonNumber(int.MinValue));
            jsons.Add("JsonNumberInt32MaxValue", new JsonNumber(int.MaxValue));

            // long
            jsons.Add("JsonNumberInt64MinValue", new JsonNumber(long.MinValue));
            jsons.Add("JsonNumberInt64MaxValue", new JsonNumber(long.MaxValue));

            // float
            jsons.Add("JsonNumberSingleMinValue", new JsonNumber(float.MinValue));
            jsons.Add("JsonNumberSingleMaxValue", new JsonNumber(float.MaxValue));
            jsons.Add("JsonNumberSingleNaN", new JsonNumber(float.NaN));
            jsons.Add("JsonNumberSingleEpsilon", new JsonNumber(float.Epsilon));
            jsons.Add("JsonNumberSingleNegativeInfinity", new JsonNumber(float.NegativeInfinity));
            jsons.Add("JsonNumberSinglePositiveInfinity", new JsonNumber(float.PositiveInfinity));

            // double
            jsons.Add("JsonNumberDoubleMinValue", new JsonNumber(double.MinValue));
            jsons.Add("JsonNumberDoubleMaxValue", new JsonNumber(double.MaxValue));
            jsons.Add("JsonNumberDoubleNaN", new JsonNumber(double.NaN));
            jsons.Add("JsonNumberDoubleEpsilon", new JsonNumber(double.Epsilon));
            jsons.Add("JsonNumberDoubleNegativeInfinity", new JsonNumber(double.NegativeInfinity));
            jsons.Add("JsonNumberDoublePositiveInfinity", new JsonNumber(double.PositiveInfinity));

            return jsons;
        }

        public static JsonArray Generate(DateTime now) {
            return JsonArray.Empty;
        }

        public static string GenerateDictionaryString(DateTime now) {
            StringBuilder sb = new StringBuilder("{");
            IDictionary<string, IJsonObject> dict = GenerateDictionary(now);

            foreach (KeyValuePair<string, IJsonObject> kvp in dict) {
                sb.AppendFormat("{0}:{1},", kvp.Key, kvp.Value.ToString());
            }

            sb.Remove(sb.Length - 1, 1);
            sb.Append("}");

            return sb.ToString();
        }

        public static IDictionary<string, IJsonObject> GenerateDictionary(DateTime now) {
            IDictionary<string, IJsonObject> json = new Dictionary<string, IJsonObject>();

            IDictionary<string, JsonBoolean> jsonBools = GenerateJsonBooleans();
            foreach (KeyValuePair<string, JsonBoolean> kvp in jsonBools) {
                json.Add(kvp.Key, kvp.Value);
            }

            IDictionary<string, JsonDateTime> jsonDateTimes = GenerateJsonDateTime(now);
            foreach (KeyValuePair<string, JsonDateTime> kvp in jsonDateTimes) {
                json.Add(kvp.Key, kvp.Value);
            }

            IDictionary<string, JsonNumber> jsonNumbers = GenerateJsonNumber();
            foreach (KeyValuePair<string, JsonNumber> kvp in jsonNumbers) {
                json.Add(kvp.Key, kvp.Value);
            }

            return json;
        }

        public static JsonDictionary GenerateJsonDictionary(DateTime now) {
            JsonDictionary json = new JsonDictionary();

            IDictionary<string, JsonBoolean> jsonBools = GenerateJsonBooleans();
            foreach (KeyValuePair<string, JsonBoolean> kvp in jsonBools) {
                json[kvp.Key] = kvp.Value;
            }

            IDictionary<string, JsonDateTime> jsonDateTimes = GenerateJsonDateTime(now);
            foreach (KeyValuePair<string, JsonDateTime> kvp in jsonDateTimes) {
                json[kvp.Key] = kvp.Value;
            }

            IDictionary<string, JsonNumber> jsonNumbers = GenerateJsonNumber();
            foreach (KeyValuePair<string, JsonNumber> kvp in jsonNumbers) {
                json[kvp.Key] = kvp.Value;
            }

            return json;
        }
    }
}
